package 剑指专题.模拟;


/*
 * Author：江松
 * Date：2023/4/1 20:52
 *
 比较数值的字符串:
 1，首先去除收尾空格
 2，进行判断，数字，小数点后面应该全是数字（或者e），e后面全是数字
 最终必须保证flag为真且走完了
 */

public class Main4 {


        //遍历字符串的下标
        private int index = 0;
        //有符号判断
        private boolean integer(String s){
            if(index < s.length() && (s.charAt(index) == '-' || s.charAt(index) == '+'))
                index++;
            return unsigned_integer(s);
        }
        //无符号数判断
        private boolean unsigned_integer(String s){
            int temp = index;
            while(index < s.length() && (s.charAt(index) >= '0' && s.charAt(index) <= '9'))
                index++;
            return index > temp;
        }
        public boolean isNumeric (String str) {
            //先判断空串
            if(str == null || str.length() == 0)
                return false;
            //去除前面的空格
            while(index < str.length() && str.charAt(index) == ' ')
                index++;
            int n = str.length() - 1;
            //去除字符串后面的空格
            while(n >= 0 && str.charAt(n) == ' ')
                n--;
            //限制的长度比下标1
            n++;
            //全是空格情况
            if(n < index)
                return false;
            //判断前面的字符是否是有符号的整数
            boolean flag = integer(str);
            //如果有小数点
            if(index < n && str.charAt(index) == '.'){
                index++;
                //小数点前后有无数字可选
                flag = unsigned_integer(str) || flag;
            }
            //如果有e
            if(index < n && (str.charAt(index) == 'e' || str.charAt(index) == 'E')){
                index++;
                //e后面必须全是整数
                flag = flag && integer(str);
            }
            //是否字符串遍历结束
            return flag && (index == n);
        }



}
